export {};

// 泛型函数的定义
function echo<Type>(value: Type[]): Type[] {
  console.log(value.length);
  return value;
}

let result1 = echo<string>(['a', 'b']);
let result2 = echo([1, 2]);

// 添加自定义的类型约束
interface ILength {
  length: number;
}
type Length = {
  length: number;
};

function echo2<Type extends ILength>(value: Type): Type {
  console.log(value.length);
  return value;
}
// 类型约束可以继承类型定义
function echo3<Type extends Length>(value: Type): Type {
  console.log(value.length);
  return value;
}
console.log('=============');
echo2('abc'); // 可以
echo2({ length: 10 }); // 可以
echo2([1, 2, 3, 4]); // 可以
echo2({ length: 1, bingo: '兵哥' }); // 可以
// 上面四个可以是根据“至少有一个 number 类型的 length 属性” 推断出来的。

// echo2({ length: '10' }); // 错误
// echo2({ length2: 10 }); // 错误
